﻿using Persistencia;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Dlls
{
    public class OrdemServicoDLL
    {
        Context context;

        public OrdemServicoDLL()
        {
            context = new Context();

        }
        public IEnumerable<OrdemServico> List()
        {
            return (from o in context.OrdemsServicos select o).ToList();
        }

        public void Insert(OrdemServico OrdemServico)
        {
            context.OrdemsServicos.InsertOnSubmit(OrdemServico);
            context.SubmitChanges();
        }

        public void Update(int codigo, OrdemServico OrdemServico)
        {
            OrdemServico OrdemS = context.OrdemsServicos.SingleOrDefault(e => e.Codigo == codigo);
            OrdemS.CodPessoa = OrdemServico.CodPessoa;
            OrdemS.Pedido = OrdemServico.Pedido;
            OrdemS.Lote = OrdemServico.Lote;
            OrdemS.DataAbertura = OrdemServico.DataAbertura;
            OrdemS.DataFechamento = OrdemServico.DataFechamento;
            OrdemS.Situacao = OrdemServico.Situacao;
            OrdemS.ValorMaterial = OrdemServico.ValorMaterial;
            OrdemS.ValorServico = OrdemServico.ValorServico;
            OrdemS.ValorImovel = OrdemServico.ValorImovel;
            OrdemS.ValorTotal = OrdemServico.ValorTotal;
            OrdemS.PrevisaoEntrega = OrdemServico.PrevisaoEntrega;
            OrdemS.DataEntrega = OrdemServico.DataEntrega;
            OrdemS.NomeResponsavel = OrdemServico.NomeResponsavel;
            OrdemS.AutorizadoPor = OrdemServico.AutorizadoPor;
            OrdemS.ReclamacaoCliente = OrdemServico.ReclamacaoCliente;
            OrdemS.ObservacaoOs = OrdemServico.ObservacaoOs;

            context.SubmitChanges();
            
        }

        public void Delete(OrdemServico OrdemServico)
        {
            context.OrdemsServicos.DeleteOnSubmit(OrdemServico);
            context.SubmitChanges();
        }

        public OrdemServico getOrdemServico(int codigo)
        {
            return context.OrdemsServicos.SingleOrDefault(e => e.Codigo == codigo);
        }

        public int getLastInsertID()
        {
            var nextId = context.OrdemsServicos.Max(x => x.Codigo);
            return nextId;
        }

        //Ordem de Serviço, Situacao
        public void InserirOrdemServicoSituacao(int situacao) 
        { 
             OrdemServicoSituacao ordemServicoSituacao= new OrdemServicoSituacao()
             {
                CodOs = getLastInsertID(),
                Situacao = situacao
             };

             context.OrdemsServicoSituacao.InsertOnSubmit(ordemServicoSituacao);
             context.SubmitChanges();
        }

        public void AlterarOrdemServicoSituacao(int codOs,int situacao) 
        {
            OrdemServicoSituacao ordemServicoSituacao = context.OrdemsServicoSituacao.SingleOrDefault(e => e.CodOs == codOs);
            ordemServicoSituacao.Situacao = situacao;
            
            context.SubmitChanges();
        }
        
        public List<OrdemServico> ObterListaDeOsPorSituacao(int situacao)
        {
            string osSituacao ="";
            List<OrdemServico> ordemsDeServico = new List<OrdemServico>();
            
            var resultSituacao = (from o in context.OrdemsServicoSituacao.Where(o => o.Situacao == situacao) select o).ToList();
            
            foreach (OrdemServicoSituacao s in resultSituacao) 
            {
                if (s.Situacao == situacao)
                {
                    OrdemServico resultOS = context.OrdemsServicos.SingleOrDefault(o=>o.Codigo==s.CodOs);
                    if (situacao == 0)
                    {
                        osSituacao = "OS aberta.";
                    }
                    else if (situacao == 1)
                    {
                        osSituacao = "OS em execução.";
                    }
                    else if (situacao == 2)
                    {
                        osSituacao = "OS finalizada.";
                    }

                    resultOS.Situacao = osSituacao;
                    ordemsDeServico.Add(resultOS);
                }

            }

            return ordemsDeServico;
        }

        //Ordem de Serviço, Andamentos
        /// <summary>
        /// 
        /// </summary>
        /// <param name="codOs">Código da Os</param>
        public IEnumerable<OrdemServicoAndamento> ObterListaDeAndamentosPorCodOs(int codOs) 
        {
            var result = (from a in context.OrdemsServicoAndamento.Where(a => a.CodOS == codOs).OrderBy(a=>a.Item) select a).ToList();
            return result;
        }

        public void InerirOrdemServicoAndamento(int codOs, int codSituacao, int codUsuario, int codItem)
        {
            OrdemServicoAndamento ordemServicoSituacao = new OrdemServicoAndamento()
            {
                CodOS = codOs,
                CodSituacao = codSituacao,
                DataAndamento = DateTime.Now,
                Item = codItem,
                CodUsuario = codUsuario
            };

            context.OrdemsServicoAndamento.InsertOnSubmit(ordemServicoSituacao);
            context.SubmitChanges();
        }

        
        public int ObterNextItemAndamentoDaOs(int codOs) {
            
            int totalItem = ( from  a in context.OrdemsServicoAndamento.Where(a => a.CodOS == codOs) select a).Count();
            int nextItem = totalItem + 1;

            return nextItem;
        }

        /*public void AlterarOrdemServicoAndamento(int codOs, int situacao)
        {
            OrdemServicoAndamento ordemServicoAndamento = context.OrdemsServicoAndamento.SingleOrDefault(e => e.CodOS == codOs);

            ordemServicoAndamento.CodOS = codOs;
            ordemServicoAndamento.CodSituacao = situacao;
            ordemServicoAndamento.DataAndamento = DateTime.Now;

            context.SubmitChanges();
        }*/

    }
}
